package bo.gotthardt.user; import bo.gotthardt.email.LoggerEmailService; import bo.gotthardt.model.EmailVerification; import bo.gotthardt.model.User; import bo.gotthardt.test.ApiIntegrationTest; import io.dropwizard.testing.junit.ResourceTestRule; import org.junit.Before; import org.junit.ClassRule; import org.junit.Test; import java.time.Duration; import java.time.LocalDateTime; import java.util.List; import static bo.gotthardt.test.assertj.DropwizardAssertions.assertThat; /** * Tests for {@link bo.gotthardt.user.EmailVerificationResource}. * * @author Bo Gotthardt */ public class EmailVerificationResourceTest extends ApiIntegrationTest { private static final PasswordResetService service = new PasswordResetService(db, new LoggerEmailService()); @ClassRule public static final ResourceTestRule resources = ResourceTestRule.builder() .addResource(new EmailVerificationResource(db, service)) .setMapper(getMapper()) .build(); private User user; @Override public ResourceTestRule getResources() { return resources; } @Before public void setupUser() { user = new User("testname", "testpassword", "Testuser"); db.save(user); } @Test public void shouldGetByToken() { EmailVerification verify = new EmailVerification(user, Duration.ofDays(2), EmailVerification.Type.PASSWORD_RESET); db.save(verify); assertThat(GET("/verifications/" + verify.getToken())) .hasJsonContent(verify); } @Test public void shouldCreateVerificationTokenForUsername() { POST("/verifications/passwordreset", formParameters("username", "testname")); List<EmailVerification> verifys = db.find(EmailVerification.class).findList(); assertThat(verifys).hasSize(1); assertThat(verifys.get(0).getUser()).isEqualTo(user); assertThat(verifys.get(0).getType()).isEqualTo(EmailVerification.Type.PASSWORD_RESET); assertThat(verifys.get(0).getExpirationDate()).isAfter(LocalDateTime.now()); } @Test public void shouldCreateVerificationTokenForEmail() { user.setEmail("example@example.com"); db.save(user); POST("/verifications/passwordreset", formParameters("username", "example@example.com")); List<EmailVerification> verifys = db.find(EmailVerification.class).findList(); assertThat(verifys).hasSize(1); assertThat(verifys.get(0).getUser()).isEqualTo(user); assertThat(verifys.get(0).getType()).isEqualTo(EmailVerification.Type.PASSWORD_RESET); assertThat(verifys.get(0).getExpirationDate()).isAfter(LocalDateTime.now()); } @Test public void shouldChangePasswordWhenUsed() { EmailVerification verify = new EmailVerification(user, Duration.ofDays(2), EmailVerification.Type.PASSWORD_RESET); db.save(verify); POST("/verifications/" + verify.getToken() + "/passwordreset", formParameters("newPassword", "testpassword2")); db.refresh(user); assertThat(user.getPassword().equalsPlaintext("testpassword2")).isTrue(); } }